package com.gestion.controlador;

import com.gestion.modelo.PedidoModelo;
import com.gestion.modelo.dominio.EstadosPedido;
import com.gestion.modelo.dominio.Pago;
import com.gestion.modelo.dominio.Pedido;
import com.gestion.modelo.dominio.TipoUsuario;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import vista.JIFPedido;

/**
 * @author Mauri@<itsoluciones.com.ar>
 */
//<editor-fold defaultstate="collapsed" desc="Para JIFPedido">
public class PedidoControlador {

    private PedidoModelo pedidoModelo;
    private JIFPedido jIFPedido;
    //</editor-fold>

    /**
     * Constructor con Listener
     *
     * @param pedidoModelo formulario
     * @param jIFPedido vista
     */
    public PedidoControlador(final PedidoModelo pedidoModelo, final JIFPedido jIFPedido) {
        //System.out.println(this.toString());

        this.pedidoModelo = pedidoModelo;
        this.jIFPedido = jIFPedido;

        actualizarPantalla();

        jIFPedido.agregarVerificarPagoListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //si no existe lo creo
                if (pedidoModelo.getPedido().getPago() == null) {
//creo el pago
                    Pago pagoNuevo = new Pago(true, new Date(), pedidoModelo.getPedido());
//lo agrego al modelo  
                    pedidoModelo.agregarPago(pagoNuevo, pedidoModelo.getPedido());
//Pago pagoNuevo = pedidoModelo.agregarPago(new Pago(true, new Date(), pedidoModelo.getPedido()), pedidoModelo.getPedido());
                    pedidoModelo.getPedido().setPago(pagoNuevo);
                } else {
                    pedidoModelo.getPedido().getPago().setVerificado(true);
//lo agrego al modelo  
                    pedidoModelo.modificarPedido(pedidoModelo.getPedido());
                }
                actualizarPantalla();
            }
        });

        jIFPedido.agregarCancelarPagoListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                pedidoModelo.getPedido().getPago().setVerificado(false);
                pedidoModelo.getPedido().setEstado(EstadosPedido.PENDIENTE);
//Pago pagoNuevo = new Pago(false, new Date(), pedidoModelo.getPedido());
//lo agrego al modelo  
                pedidoModelo.modificarPedido(pedidoModelo.getPedido());
                actualizarPantalla();
            }
        });

        jIFPedido.agregarEntregarPedidoListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                pedidoModelo.getPedido().setEstado(EstadosPedido.ENTREGAR);
                pedidoModelo.modificarPedido(pedidoModelo.getPedido());

                actualizarPantalla();
                jIFPedido.dispose();
// Ver como lograr que el menú anterior refleje los cambios.
            }
        });

        jIFPedido.agregarPedidoEntregadoListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                pedidoModelo.getPedido().setEstado(EstadosPedido.ENTREGADO);
//fecha actual de entrega
                pedidoModelo.getPedido().setFecha_entrega(new Date());
//descuento los productos del pedido.
                pedidoModelo.eliminarProductosPorPedido(pedidoModelo.getPedido().getId());

                pedidoModelo.modificarPedido(pedidoModelo.getPedido());

                actualizarPantalla();
                jIFPedido.dispose();
            }
        });

        jIFPedido.agregarPedidoNoEntregadoListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                pedidoModelo.getPedido().setEstado(EstadosPedido.NOENTREGADO);
                pedidoModelo.modificarPedido(pedidoModelo.getPedido());
                actualizarPantalla();
            }
        });

        jIFPedido.agregarCancelarPedidoListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                pedidoModelo.getPedido().setEstado(EstadosPedido.CANCELADO);
                pedidoModelo.modificarPedido(pedidoModelo.getPedido());
                actualizarPantalla();
                jIFPedido.dispose();
            }
        });

    }

    private void actualizarPantalla() {
        //System.out.println("" + pedidoModelo.getPedido().getPago().isVerificado());
        if (!(pedidoModelo.getPedido().getPago() == null)) {
            if (pedidoModelo.getPedido().getPago().isVerificado() == true) {
                jIFPedido.botonPagoVerificado(false);
                jIFPedido.botonCancelarPago(true);
                jIFPedido.botonEntregar(true);
            } else if (pedidoModelo.getPedido().getPago().isVerificado() == false) {
                jIFPedido.botonPagoVerificado(true);
                jIFPedido.botonCancelarPago(false);
                jIFPedido.botonEntregar(false);
            }
            if ((pedidoModelo.getPedido().getEstado() == EstadosPedido.ENTREGAR)) {
                jIFPedido.botonEntregar(false);
            }
        } else {
            jIFPedido.botonPagoVerificado(true);
            jIFPedido.botonCancelarPago(false);
            jIFPedido.botonEntregar(false);
        }

        //<editor-fold defaultstate="collapsed" desc="Botones según Usuario">
        if (TipoUsuario.USER.equals(Session.getInstance().getUsuario().getTipousuario())) {
            jIFPedido.botonesUsuario();
        }

        if (TipoUsuario.ADMIN.equals(Session.getInstance().getUsuario().getTipousuario())) {
            jIFPedido.botonesAdmin();
        }
        //</editor-fold>
        this.jIFPedido.setTitle("Pedido Nº " + pedidoModelo.getPedido().getId());
        this.jIFPedido.llenarDatos(pedidoModelo.getPedido());
    }

    /**
     * Crea y muestra el formulario
     *
     * @param pedido Pedido
     */
    public static void invocarVista(final Pedido pedido) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
// "Modelo"
                PedidoModelo pedidoModelo = new PedidoModelo(pedido);
// "Vista"
                JIFPedido jifPedido = new JIFPedido();

                PedidoControlador pedidoControlador = new PedidoControlador(pedidoModelo, jifPedido);

                UIControlador.getInstance().agregarVista(jifPedido);
            }
        });
    }
}
